package com.sigmatrix.h5.service.inspect;

import java.util.List;

import com.sigmatrix.h5.auth.ILoginUser;
import com.sigmatrix.h5.entity.CodeCirculation;
import com.sigmatrix.h5.web.args.QueryQrCodeParamV2;
import com.sigmatrix.h5.web.mode.SigmatrixLocationWrapper;

/**
 * 码稽查接口
 * 
 * @author wei.wang
 *
 */
public interface ICodeInspect extends ICodeFlee {
	
	
	/**
	 * 稽查
	 * @param vo
	 * @param esecode
	 * @param user
	 * @return
	 */
	InspectResult inspect(QueryQrCodeParamV2 vo,String esecode,ILoginUser user);
	
	/**
	 * 通过 码流转记录 检查经销商串货
	 * @param agency
	 * @param esecode
	 * @param codeCirculations
	 * @return
	 */
	boolean inspectByDealer(Agency agency, String esecode, List<CodeCirculation> codeCirculations);
	

	/**
	 * 通过码流转记录检查区域串货
	 * @param esecode
	 * @param currentLocation
	 * @param codeCirculations
	 * @return
	 */
	boolean inspectByArea(String esecode, SigmatrixLocationWrapper currentLocation,
			List<CodeCirculation> codeCirculations);

	/**
	 * 获取稽查码相关信息
	 * 
	 * @param param 稽查参数
	 * @param esecode 企业代码
	 * @return
	 */
	CurrentQrCode getQrCode(QueryQrCodeParamV2 param,String esecode);
	
//	/**
//	 * 
//	 * @param qrCode
//	 * @param codeType
//	 * @return
//	 */
//	CurrentQrCode getQrCode(String qrCode,Short codeType,String esecode);
	
}

/**
 * 稽查流程：
 */

//合并
//获取产品的信息。
//-----------------------------------------------------------
//产品，码及所需相关的码。
//-----------------------------------------------------------

//1		码流转是否串货
//获取码流转（没有串货）
	//判断码类型。
		//如果是瓶码。--瓶码的流转记录
//				   --箱码的流转记录
//      如果是盒码。--瓶码的流转记录
//				   --箱码的流转记录
//		     如果是箱码。--箱码的流转记录
//（盒-->瓶-->瓶-->箱-->向上找包装单位）
//码流转集合-根据时间排序。
//判断流转记录之间是否有中断。
//	没有   ------------------》没有串货
//	有 ：判断是否包含关系		
//	   否   ------------------》串货
//	 是   ------------------》没串货
//记录 

//-----------------------------------------------------------
//稽查点区域，流转最后一个记录，及接收方信息
//-----------------------------------------------------------


//2	          稽查
//    稽查1经销商
//得到码流转最后一个记录
//      接受方的子经销链。
//稽查点为经销商。
//     稽查3经销商，当稽查指定地点为经销商，同时稽查指定地点在有可能在流转链中间，或在流转链外。
//     在流转最后一个记录的流转链的范围中----ok
//     在流转在流转链中----ok
// 	   其他    ----ng
//稽查点为门店。
//      	只有一个 子且相等----ok
//    		只有一个 子且为虚拟门店----ok
//    		最后一个不为门店----ok
//    或
//			只有一个 子且不为虚拟门店且不相等----ng

//			稽查2区域
//得到码流转最后一个记录 看区域范围是否在这个稽查gps范围内
//			注：当稽查经销商：指定地点为经销商，该经销商在流转链中间；那稽查gps应该和码流转最后一条比较还是和该经销商（该经销商所在流转链中的点）比较。--现在用最后一条码流转记录
//	最后一个记录出货目标为门店，gps和该门店在同一个区域--ok， 否则--ng
//最后一个记录出货目标为经销商，gps在此经销商在范围内 --ok 否则--ng
//

//汇总结果返回。
//问题点：没有考虑退库操作。


